package ControleurBelote;


//
// IUT de Nice / Departement informatique / Module APO-Java
// Annee 2011_2012 - Composants generiques
//
// Classe ControleurG - Controleur de composants graphiques MVC 
//
// Edition A    : externalisation depuis les controleurs de panneaux et de 
//                barre de menus 
//
//    + Version 1.0.0	: couverture des besoins initiaux des controleurs
//                        des classes PanneauG et BarreMenusG
//    + Version 1.1.0   : redefinition methode mouseClicked pour mettre a
//                        jour les attributs "positionDernierClic" et
//                        "nbClics" 
//    + Version 1.2.0	: ajout methode protegee attendre
//    + Version 1.3.0	: ajout nouvelle signature methode attendreClic
//
// Auteur : A. Thuaire
//

import java.awt.Dimension;
import java.awt.event.MouseEvent;
  
public class ControleurG extends EspionG {
private Dimension positionDernierClic;
private int       nbClics= 0;          
   
// ---                                            Methode obtenirDernierClic

   public Dimension obtenirDernierClic () {return positionDernierClic;}
   
// ---                                            Methode obtenirNombreClics

   public int obtenirNombreClics () {return nbClics;}
   
// ---                                                  Methode attendreClic

   public Dimension attendreClic () {
   int nbClics= obtenirNombreClics();
         
      while (nbClics != obtenirNombreClics() - 1) {Chrono.attendre(100);}
      return obtenirDernierClic();	
   }
   
// ---                                                  Methode attendreClic

   public Dimension attendreClic (int tempsMaximum) throws Throwable {
   int nbClics= obtenirNombreClics();
   	
      // Controler la validite du parametre
      //
      if (tempsMaximum < 0) throw new Throwable ("-2.1");
    
      // Attendre le prochain clic operateur dans la limite du 
      // temps maximum fixe par le parametre
      // 
      int tempsEcoule= 0;   
      while (nbClics != obtenirNombreClics() - 1 && 
             tempsEcoule < tempsMaximum) {
             	
         Chrono.attendre(100);
         tempsEcoule += 100;
      }
      
      // Traiter le cas ou le time out est atteint
      //
      if (tempsEcoule >= tempsMaximum) return null;
      
      // Restituer le resultat
      //
      return obtenirDernierClic();	
   }
   
// ---                                                  Methode mouseClicked

   @Override
public void mouseClicked  (MouseEvent e) {
     
      // Appeler l'ecouteur de la classe mere
      //
      super.mouseClicked(e);
      
      // Memoriser la position du dernier clic
      //
      positionDernierClic= new Dimension (e.getX(), e.getY());
      
      // Incrementer le nombre de clics
      //
      nbClics++;
    }
    
// ---                                                     Methode attendre

   protected void attendre (int duree) {
   	
      if (duree <= 0) return;
      
      Chrono.attendre(duree);
   } 
   
// -------------------------------------       Classe interne privee Chrono
   
   private static class Chrono {

      public static void attendre (int tms) {
         	
         // Attendre tms millisecondes, en bloquant le thread courant 
         //
         try {Thread.currentThread();
		Thread.sleep(tms);} 
         catch(InterruptedException e){ }
      }
   }  
} 
